What is R?


After installing the software, open RStudio


Set the folder RStudio uses when not in a project

  • From “Preferences” set the default folder to your documents or other convenient folder.

  • I set mine to my Dropbox folder.

  • After you have set the folder, quit and reopen RStudio.


Make a “project” for this course


Click “New Directory” for your project


Select “New Project”


Give the project folder a name


Your desktop should look something like this


Set the “Project Options”


Set the three options to “Yes”


RStudio has four panes


Packages

install.packages("AER", "dynlm", "fGarch", "FinCal", "kableExtra", "MASS", "reshape2", "stargazer", "tidyquant", "tidyverse", "wesanderson", "xtable", dependencies = TRUE)

library(AER)


Where are my files?

getwd()

setwd("/Users/Clinton/Dropbox/syncd_r_data/econometrics")

Special HIDDEN R files in your working directory


Using the “.Rprofile” file to configure an R session

# Portfolio Management .Rprofile file

# Auto-load packages:
library(AER)
library(broom)
library(data.table)
library(dynlm)
library(fBasics)
library(fGarch)
library(FinCal)
library(ggplot2)
library(kableExtra)
library(magrittr)
library(MASS)
library(matrixStats)
library(quadprog)
library(quantmod)
library(RColorBrewer)
library(reshape2)
library(rmarkdown)
library(stargazer)
library(timeSeries)
library(tseries)
library(wesanderson)
library(xtable)
library(xts)
library(tidyquant)
library(tidyverse)

# Set some of R options:
options(prompt="R> ", scipen=999, digits=4, width=80)


Rmarkdown and Notebooks


Install TinyTeX using the package called tinytex

tinytex::install_tinytex()


Test your Rmarkdown environment


Information on Rmarkdown and TinyTeX


Resources for R


CRAN Task Views


Books on R


R-Bloggers


RStudio Keyboard Shortcuts (for Mac)


© Copyright Clinton Watkins 2021


References

Andrecut, M. 2010. Portfolio Optimization in R.” Cornell University, arXiv:1307.0450 [q-fin.PM]. https://doi.org/10.1201/b17178.
Bennett, Mark J., and Dirk L. Hugen. 2016. Financial analytics with R : building a laptop laboratory for data science. Cambridge University Press. https://op.lib.kobe-u.ac.jp/opac/opac{\_}link/bibid/2002211471.
Cowpertwait, Paul S. P., and Andrew V. Metcalfe. 2009. Introductory Time Series with R. Springer. https://doi.org/10.1007/978-0-387-88698-5.
Kleiber, Christian, and Achim Zeileis. 2008. Applied Econometrics with R. 1st ed. New York: Springer US. https://doi.org/10.1007/978-0-387-77318-6.
Matloff, Norman. 2011. The Art of R Programming: A Tour of Statistical Software Design. No Starch Press. https://www.nostarch.com/artofr.htm.
Tsay, Ruey S. 2010. Analysis of financial time series. Wiley.
———. 2014. Multivariate time series analysis : with R and financial applications. Wiley.
Venables, W. N., D. M. Smith, and R Core Team. 2019. An Introduction to R.” https://doi.org/10.1201/9781420035025.ch1.
LS0tCnRpdGxlOiAiRmluYW5jZSBEYXRhIFdvcmtzaG9wIFtFQ04zMzldIgpzdWJ0aXRsZTogIkEgR3VpZGUgdG8gU2V0dGluZy11cCBSIGFuZCBSU3R1ZGlvIgphdXRob3I6IDxicj4gQ2xpbnRvbiBXYXRraW5zCm91dHB1dDogaHRtbF9ub3RlYm9vawpiaWJsaW9ncmFwaHk6IC4uLy4uLy4uLy4uLy4uL2JpYnRleC9Qb3J0Zm9saW9NYW5hZ2VtZW50LmJpYgotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmgxLnRpdGxlIHsKICBmb250LXNpemU6IDI0cHQ7CiAgY29sb3I6IGRhcmtibHVlOwp9CgpoMy5zdWJ0aXRsZSB7CiAgZm9udC1zaXplOiAyNHB0OwogIGNvbG9yOiBkYXJrYmx1ZTsKfQoKaDIgewogIGZvbnQtc2l6ZTogMThwdDsKfQoKYm9keSwgdGQgewogICBmb250LXNpemU6IDExcHQ7Cn0KY29kZS5yewogIGZvbnQtc2l6ZTogOXB0Owp9CnByZSB7CiAgZm9udC1zaXplOiA5cHQKfQo8L3N0eWxlPgoKYGBge3IsIGluY2x1ZGU9Rn0Kcm0obGlzdCA9IGxzKCkpCmBgYAoKPGJyPgoKLS0tLQoKIyMgV2hhdCBpcyBSPwoKPHA+CgotIF9fUl9fIGlzIGFuIG9wZW5zb3VyY2UgcG93ZXJmdWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2Ugc3VpdGVkIHRvIG1hdGhlbWF0aWNhbCBhbmQgc3RhdGlzdGljYWwgY29tcHV0aW5nLCBhbmFseXNpcyBhbmQgZ3JhcGhpY3MuIAoKICAgIC0gRG93bmxvYWQgUiBmcm9tIGhlcmU6IGh0dHBzOi8vd3d3LnItcHJvamVjdC5vcmcvIAogICAgCjxwPgoKLSBfX1JTdHVkaW9fXyBwcm92aWRlcyBhIGNvbnZlbmllbnQgaW50ZXJmYWNlIGZvciB1c2luZyBSLiBCb3RoIFIgYW5kIFJTdHVkaW8gYXJlIGZyZWUuCgogICAgLSBEb3dubG9hZCBSU3R1ZGlvIChmcmVlIERlc2t0b3AgT3BlbiBTb3VyY2UgRWRpdGlvbikgZnJvbSBoZXJlOiBodHRwczovL3d3dy5yc3R1ZGlvLmNvbS8gIAogICAgLSBfX1JTdHVkaW8gQ2xvdWRfXyBwcm92aWRlcyBSIGFuZCBSU3R1ZGlvIHZpYSBhIHdlYiBicm93c2VyLiBZb3UgY2FuIG1ha2UgYSBmcmVlIGFjY291bnQgYnV0IHRoZSBhbW91bnQgb2YgdGltZSB5b3UgY2FuIHVzZSB0aGUgc2VydmljZSBmb3IgZnJlZSBpcyBsaW1pdGVkLiBUaGlzIG1heSBiZSBhIGdvb2Qgb3B0aW9uIGlmIHlvdSBoYXZlIGRpZmZpY3VsdGllcyBzZXR0aW5nIHVwIHRoZSBzb2Z0d2FyZSBvbiB5b3VyIG93biBjb21wdXRlci4gUmVtZW1iZXIgdG8gY29weSBhbnkgZmlsZXMgeW91IG1ha2UgZnJvbSBSU3R1ZGlvIENsb3VkIHRvIHlvdXIgb3duIGNvbXB1dGVyIHNvIHRoYXQgeW91IGRvIG5vdCByaXNrIGxvc2luZyB5b3VyIHdvcmsuIFJTdHVkaW8gQ2xvdWQgY2FuIGJlIGZvdW5kIGhlcmU6IGh0dHBzOi8vcnN0dWRpby5jbG91ZC8KCjxwPgoKLSBXZSB3aWxsIHVzZSBSIHZpYSBSU3R1ZGlvIGluIHRoaXMgY291cnNlIHRvIGFuYWx5c2Ugc2VjdXJpdGllcyByaXNrIGFuZCByZXR1cm5zLCBhbmQgY29uc3RydWN0IGFuZCBwb3J0Zm9saW9zLgoKPCEtLSBZb3UgYXJlIHdlbGNvbWUgdG8gYnJpbmcgeW91ciBvd24gbm90ZWJvb2sgY29tcHV0ZXIgdG8gdGhlIGxhYiBzZXNzaW9ucyBpZiB5b3Ugd2lzaC4gWW91IHdpbGwgYmVlbiB0byBjb25uZWN0IHRvIHRoZSBpbnRlcm5ldC4gLS0+CgotLS0tCgojIyBBZnRlciBpbnN0YWxsaW5nIHRoZSBzb2Z0d2FyZSwgb3BlbiBSU3R1ZGlvCgo8cD4KCi0gSXQgc2hvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpcy4KCjxwPgoKIVtdKGFzc2V0cy9wMS5wbmcpCgotLS0tCgojIyMgU2V0IHRoZSBmb2xkZXIgUlN0dWRpbyB1c2VzIHdoZW4gbm90IGluIGEgcHJvamVjdAoKPHA+CgotIEZyb20gIlByZWZlcmVuY2VzIiBzZXQgdGhlIGRlZmF1bHQgZm9sZGVyIHRvIHlvdXIgZG9jdW1lbnRzIG9yIG90aGVyIGNvbnZlbmllbnQgZm9sZGVyLiAKCi0gSSBzZXQgbWluZSB0byBteSBEcm9wYm94IGZvbGRlci4KCi0gQWZ0ZXIgeW91IGhhdmUgc2V0IHRoZSBmb2xkZXIsIHF1aXQgYW5kIHJlb3BlbiBSU3R1ZGlvLgoKPHA+CgohW10oYXNzZXRzL3AyLnBuZykKCi0tLS0KCiMjIE1ha2UgYSAicHJvamVjdCIgZm9yIHRoaXMgY291cnNlCgo8cD4KCi0gQSBwcm9qZWN0IGlzIGEgZm9sZGVyIHdoZXJlIHlvdSBjYW4ga2VlcCBkYXRhLCBjb2RlIGFuZCBkb2N1bWVudHMgdG9nZXRoZXIuCgotIFlvdSBjYW4gaGF2ZSBzZXZlcmFsIGRpZmZlcmVudCBwcm9qZWN0cyBhbmQgc2V0IFIgdG8gc3RhcnQgdXAgZGlmZmVyZW50bHkgZm9yIGVhY2ggcHJvamVjdC4gUHJvamVjdHMgYWxsb3cgeW91IHRvIGtlZXAgeW91ciBmaWxlcyBvcmdhbmlzZWQsIGFuZCBsZXQgeW91IGN1c3RvbWlzZSBob3cgUiB3b3Jrcy4gCgotIElmIHlvdSB1c2UgUiBmb3Igb3RoZXIgY2xhc3NlcywgeW91ciBzZW1pbmFyIG9yIG90aGVyIHB1cnBvc2VzLCB5b3UgY2FuIGNyZWF0ZSBvdGhlciBwcm9qZWN0cyBmb3IgdGhvc2UuIAoKLSBFYWNoIHByb2plY3Qgd2lsbCBoYXZlIGEgc2VwYXJhdGUgZm9sZGVyIGFuZCBmaWxlcyB0byBzYXZlIHRoZSBkYXRhIGluIHlvdXIgZW52aXJvbm1lbnQsIHlvdXIgaGlzdG9yeSBvZiBjb2RlIGV4ZWN1dGVkIGluIHRoZSBjb25zb2xlLCBhbmQgdGhlIHdheSB5b3UgaGF2ZSBSIGNvbmZpZ3VyZWQuCgotIE1ha2UgYSBuZXcgcHJvamVjdCBmcm9tIHRoZSBQcm9qZWN0cyBtZW51IGF0IHRoZSB0b3AtcmlnaHQgb2YgdGhlIHNjcmVlbi4KCjxwPgoKIVtdKGFzc2V0cy9wMy5wbmcpCgotLS0tCgojIyBDbGljayAiTmV3IERpcmVjdG9yeSIgZm9yIHlvdXIgcHJvamVjdAoKPHA+CgohW10oYXNzZXRzL3A0LnBuZykKCi0tLS0KCiMjIFNlbGVjdCAiTmV3IFByb2plY3QiCgo8cD4KCiFbXShhc3NldHMvcDUucG5nKQoKLS0tLQoKIyMgR2l2ZSB0aGUgcHJvamVjdCBmb2xkZXIgYSBuYW1lCgo8cD4KCi0gSSB1c2UgdGhlIG5hbWUgInBvcnRmb2xpb21uZ3QiLgoKLSBDbGljayAiQ3JlYXRlIFByb2plY3QiLgoKPHA+CgohW10oYXNzZXRzL3A2LnBuZykKCi0tLS0KCiMjIFlvdXIgZGVza3RvcCBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzCgo8cD4KCiFbXShhc3NldHMvcDcucG5nKQoKPCEtLSA8YnI+IC0tPgoKPCEtLSAtIFVzZSB0aGUgZm9sbG93aW5nIGNvZGUgdG8gY2hlY2sgdGhhdCB5b3VyIFIgc2Vzc2lvbiBpcyBvcGVyYXRpbmcgaW4geW91ciBwcm9qZWN0IGZvbGRlci4gLS0+Cgo8IS0tIDxwPiAtLT4KCjwhLS0gYGBge3IsIGV2YWw9RkFMU0V9IC0tPgo8IS0tIGdldHdkKCkgLS0+CjwhLS0gYGBgIC0tPgoKLS0tLQoKIyMgU2V0IHRoZSAiUHJvamVjdCBPcHRpb25zIgoKPHA+CgotIEZpbmQgdGhlICJQcm9qZWN0IE9wdGlvbnMiIGZyb20gdGhlIHByb2plY3QgbWVudSBhdCB0aGUgdG9wLXJpZ2h0IG9mIHlvdXIgc2NyZWVuLgoKPHA+CgohW10oYXNzZXRzL3A4LnBuZykKCi0tLS0KCiMjIFNldCB0aGUgdGhyZWUgb3B0aW9ucyB0byAiWWVzIgoKPHA+CgotIFRoaXMgbWVhbnMgeW91ciBkYXRhIGFuZCBoaXN0b3J5IG9mIGNvbW1hbmRzIHdpbGwgYmUgc2F2ZWQgcXVlbiB5b3UgcXVpdCBhbmQgcmVzdG9yZWQgd2hlbiB5b3Ugb3BlbiB5b3VyIHByb2plY3QgdGhlIG5leHQgdGltZS4KCjxwPgoKIVtdKGFzc2V0cy9wOS5wbmcpCgotLS0tCgojIyBSU3R1ZGlvIGhhcyBmb3VyIHBhbmVzCgo8cD4KCiFbXShhc3NldHMvcDEwLnBuZykKCjxwPgoKLSBQYW5lIDEgaXMgdGhlIHNvdXJjZSBwYW5lIHdoZXJlIHlvdSBjYW4gb3BlbiBhbmQgd29yayBvbiB2YXJpb3VzIHR5cGVzIG9mIGNvZGUgZmlsZXMgb3IgZG9jdW1lbnRzLiBZb3UgYWxzbyBkaXNwbGF5IG9iamVjdHMgaW4gdGhlIHNvdXJjZSBwYW5lLiAKCiAgICAtIFIgaXMgYW4gb2JqZWN0IG9yaWVudGVkIGxhbmd1YWdlIHdoaWNoIG1lYW5zIGV2ZXJ5dGhpbmcgaXMgYW4gb2JqZWN0IHdpdGggY2VydGFpbiBhdHRyaWJ1dGVzLCBlLmcuIGEgbWF0cml4IG9mIGRhdGEgb3IgYSBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgZGF0YS4KICAgIAogICAgLSBPYmplY3RzIGNhbiBpbnRlcmFjdCB3aXRoIGVhY2ggb3RoZXIgdG8gY2hhbmdlIHRoZWlyIGF0dHJpYnV0ZXMsIG9yIGNyZWF0ZSBvdGhlciBvYmplY3RzLgogICAgCiAgICAtIFNvbWUgaW1wb3J0YW50IHR5cGVzIG9mIG9iamVjdHMgYXJlOiB2ZWN0b3JzLCBsaXN0cywgYXJyYXlzLCBtYXRyaWNlcywgdGFibGVzLCBkYXRhIGZyYW1lcywgZnVuY3Rpb25zLgoKPHA+CgotIFBhbmUgMiBpcyB0aGUgY29uc29sZSB3aGVyZSB5b3UgY2FuIGVudGVyIGFuZCBleGVjdXRlIGNvZGUuCgotIFBhbmUgMyBjb250YWlucyB0aGUgZW52aXJvbm1lbnQgYW5kIGhpc3RvcnkgdGFicy4gVGhlIGVudmlyb25tZW50IHNob3dzIGFsbCBvYmplY3RzIHRoYXQgYXJlIGxvYWRlZCBmb3IgdXNlIChpdCBpcyBlbXB0eSBub3cpLiBUaGUgaGlzdG9yeSB0YWIgc2hvd3MgdGhlIGNvZGUgeW91IGhhdmUgZXhlY3V0ZWQgaW4gdGhlIGNvbnNvbGUuIAoKLSBQYW5lIDQgY29udGFpbnMgYSBudW1iZXIgb2YgdGFicyBzaG93aW5nIHlvdXIgZm9sZGVycyBhbmQgZmlsZXMsIHBsb3RzIHlvdSBoYXZlIGRyYXduLCBwYWNrYWdlcywgYSBoZWxwIHdpbmRvdy4KCi0tLS0KCiMjIFBhY2thZ2VzCgo8cD4KCiFbXShhc3NldHMvcDExLnBuZykKCjxwPgoKLSBQYWNrYWdlcyBleHRlbmQgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgUi4KCi0gUGFja2FnZXMgY29udGFpbiBmdW5jdGlvbnMsIGRhdGEgYW5kIG90aGVyIG9iamVjdHMuIFRoZXkgYXJlIGRlc2lnbmVkIHRvIHBlcmZvcm0gY2VydGFpbiB0eXBlcyBvZiBkYXRhIG1hbmlwdWxhdGlvbiwgYW5hbHlzaXMsIGVzdGltYXRpb24sIHZpc3VhbGlzYXRpb24sIG9wdGltaXNhdGlvbiwgZG9jdW1lbnQgY3JlYXRpb24sIGV0Yy4gCgotIFNvbWUgcGFja2FnZXMgYXJlIHBhcnQgb2YgdGhlIGRlZmF1bHQgUiBpbnN0YWxsYXRpb24sIGNhbGxlZCAiQmFzZSBSIiwgYW5kIHRoZXJlIGFyZSBhIGh1Z2UgbnVtYmVyIG9mIGFkZGl0aW9uYWwgcGFja2FnZXMgYXZhaWxhYmxlIHRoYXQgYWxsb3cgeW91IHRvIGRvIGFsbW9zdCBhbnl0aGluZyB3aXRoIFIuCgotIFdlIHdpbGwgdXNlIHNldmVyYWwgcGFja2FnZXMgaW4gdGhpcyBjb3Vyc2UuCgotIFRoZXJlIGFyZSB0d28gc3RlcHMgdG8gdXNpbmcgYSBwYWNrYWdlLgoKICAgIDEuIEluc3RhbGwgdGhlIHBhY2thZ2UuIFRoaXMgZG93bmxvYWRzIHRoZSBsYXRlc3QgdmVyc29uIG9mIHRoZSBwYWNrYWdlIGZyb20gYW4gUiByZXBvc2l0b3J5IGFuZCBzYXZlcyBpdCBvbiB5b3VyIGNvbXB1dGVyLgoKICAgIDIuIExvYWQgYSBwYWNrYWdlIGZvciB1c2UuIFdoZW4geW91IHdhbnQgdG8gdXNlIGEgcGFja2FnZSB5b3UgbXVzdCBsb2FkIGl0IGZpcnN0IHdpdGggdGhlIGxpYnJhcnkgY29tbWFuZC4gCgo8cD4KCi0gVG8gaW5zdGFsbCBhIHBhY2thZ2UsIGNsaWNrIHRoZSBpbnN0YWxsIGJ1dHRvbiwgdHlwZSBpbiB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSBhbmQgaGl0IGluc3RhbGwuCgotIEluc3RhbGwgdGhlIGZvbGxvd2luZyBwYWNrYWdlczogQUVSLCBkeW5sbSwgZkdhcmNoLCBGaW5DYWwsIGthYmxlRXh0cmEsIE1BU1MsIHJlc2hhcGUyLCBzdGFyZ2F6ZXIsIHRpZHlxdWFudCwgdGlkeXZlcnNlLCB3ZXNhbmRlcnNvbiwgeHRhYmxlLgoKICAgIC0gTm90ZSB0aGF0IFIgaXMgY2FzZS1zZW5zaXRpdmUsIHRodXMgdXBwZXItIGFuZCBsb3dlci1jYXNlIGxldHRlcnMgYXJlIGludGVycHJldGVkIGFzIGJlaW5nIGRpZmZlcmVudC4KCjxwPgoKIVtdKGFzc2V0cy9wMTIucG5nKQoKPHA+CgotIEFsdGVybmF0aXZlbHksIGluc3RhbGwgdGhlIHBhY2thZ2VzIGJ5IHJ1bm5pbmcgdGhlIGZvbGxvd2luZyBjb2RlIGluIHRoZSBjb25zb2xlLgoKPHA+CgpgYGB7ciwgZXZhbD1GQUxTRX0KaW5zdGFsbC5wYWNrYWdlcygiQUVSIiwgImR5bmxtIiwgImZHYXJjaCIsICJGaW5DYWwiLCAia2FibGVFeHRyYSIsICJNQVNTIiwgInJlc2hhcGUyIiwgInN0YXJnYXplciIsICJ0aWR5cXVhbnQiLCAidGlkeXZlcnNlIiwgIndlc2FuZGVyc29uIiwgInh0YWJsZSIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCmBgYAoKPHA+CgotIEluc3RhbGxhdGlvbiBvZiBwYWNrYWdlcyB3aWxsIHRha2Ugc29tZSB0aW1lLiBPdXIgbGlzdCBvZiBwYWNrYWdlcyB3aWxsIHJlcXVpcmUgc2V2ZXJhbCBhZGRpdGlvbmFsIHBhY2thZ2VzLCBjYWxsZWRlIGRlcGVuZGVuY2llcywgdG8gYmUgZG93bmxvYWRlZC4KCiAgICAtIElmIHlvdSBhcmUgYXNrZWQgXyJEbyB5b3Ugd2FudCB0byBpbnN0YWxsIGZyb20gc291cmNlcyB0aGUgcGFja2FnZXMgd2hpY2ggbmVlZCBjb21waWxhdGlvbj8gKFllcy9uby9jYW5jZWwpIl8gZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uLCB5b3UgY2FuIGFuc3dlciAibiIuCgogICAgLSBJZiBhbiBpbnN0YWxsYXRpb24gcmVzdWx0cyBpbiBhIG1lc3NhZ2UgbGlrZSBfIkluc3RhbGxhdGlvbiBvZiBwYWNrYWdlIFggaGFkIG5vbi16ZXJvIGV4aXQgc3RhdHVzIl8gdGhlIHBhY2thZ2Ugd2FzIG5vdCBpbnN0YWxsZWQuIFRyeSBhZ2Fpbi4gSWYgeW91IHN0aWxsIGhhdmUgYSBwcm9ibGVtLCBjb250YWN0IG1lLgogICAgCiAgICAtIEEgbWVzc2FnZSBsaWtlIF8iVGhlIGRvd25sb2FkZWQgc291cmNlIHBhY2thZ2VzIGFyZSBpbiAnZm9sZGVyIGxvY2F0aW9uJyJfIG1lYW5zIHRoZSBwYWNrYWdlcyB3ZXJlIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQuCiAgICAKPHA+CgotIFBhY2thZ2VzIG5lZWQgb25seSBiZSBpbnN0YWxsZWQgb24geW91ciBjb21wdXRlciBvbmNlLCBidXQgdGhleSBzaG91bGQgYmUgdXBkYXRlZCBmcm9tIHRpbWUgdG8gdGltZS4gCgotIFdoZW4geW91IHdpc2ggdG8gdXNlIGEgcGFja2FnZSwgaXQgbXVzdCBiZSBsb2FkZWQgdXNpbmcgdGhlIGxpYnJhcnkgY29tbWFuZC4gRm9yIGV4YW1wbGUsIHRvIGxvYWQgdGhlIEFFUiBwYWNrYWdlOgoKPHA+CgpgYGB7ciwgZXZhbD1GQUxTRX0KbGlicmFyeShBRVIpCmBgYAoKPHA+CgotIEFub3RoZXIgd2F5IHRvIGxvYWQgYSBwYWNrYWdlIGlzIHRvIHRpY2sgdGhlIGJveCBuZXh0IHRvIHRoZSBwYWNrYWdlIGluIHRoZSBQYWNrYWdlcyB0YWIuIFRoZSBwYWNrYWdlcyB0YWIgc2hvd3MgeW91IGFsbCBwYWNrYWdlcyB0aGF0IHlvdSBoYXZlIGluc3RhbGxlZC4KCjxwPgoKIVtdKGFzc2V0cy9wMTMucG5nKQoKPHA+CgotIElmIHlvdSBnZXQgYW4gZXJyb3Igc2F5aW5nIFIgY2Fubm90IGZpbmQgYSBmdW5jdGlvbiB3aGVuIHlvdSBhcmUgdHJ5aW5nIHRvIGV4ZWN1dGUgY29kZSwgaXQgaXMgYWxtb3N0IGFsd2F5cyBiZWNhdXNlIHlvdSBoYXZlIGVpdGhlciBhKSBfX25vdCBsb2FkZWQgdGhlIHBhY2thZ2VfXyB0aGF0IGNvbnRhaW5zIHRoZSBmdW5jdGlvbiwgb3IgYikgX19taXN0eXBlZCB0aGUgZnVuY3Rpb25fXy4KCi0tLS0KCiMjIFdoZXJlIGFyZSBteSBmaWxlcz8KCjxwPgoKLSBUaGUgd29ya2luZyBkaXJlY3RvcnkgaXMgd2hlcmUgUiB3aWxsIGxvb2sgZm9yIHlvdXIgZmlsZXMgYW5kIHNhdmUgZmlsZXMuCgotIFNob3cgeW91ciBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OgoKPHA+CgpgYGB7ciwgZXZhbD1GQUxTRX0KZ2V0d2QoKQpgYGAKIAogPHA+CiAKLSBUaGUgd29ya2luZyBkaXJlY3RvcnkgaXMgc2V0IGJ5IHlvdXIgcHJvamVjdC4KIAotIElmIHlvdSB3YW50IHRvIGNoYW5nZSB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IHRlbXBvcmFyaWx5IHlvdSBjYW4gc2V0IGl0IHRvIGFub3RoZXIgcGF0aC4gSGVyZSBpcyBhbiBleGFtcGxlIGZvciBteSBmb2xkZXJzOgoKYGBge3IsZXZhbD1GQUxTRX0Kc2V0d2QoIi9Vc2Vycy9DbGludG9uL0Ryb3Bib3gvc3luY2Rfcl9kYXRhL2Vjb25vbWV0cmljcyIpCmBgYAoKLSBJZiB5b3UgeW91ciB3b3JraW5nIGRpcmVjdG9yeSBpcyBhIGZvbGRlciBvbiBhIG5ldHdvcmsgZHJpdmUgb3Igb24gdGhlIGNsb3VkIChsaWtlIERyb3Bib3ggb3IgR29vZ2xlIERyaXZlKSB0aGF0IGlzIHN5bmNlZCB0byB5b3VyIGNvbXB1dGVyJ3MgaGFyZCBkcml2ZSwgeW91IHdpbGwgYmUgYWJsZSB0byB1c2UgaXQgd2l0aCBSU3R1ZGlvIG9uIG11bHRpcGxlIGNvbXB1dGVycy4KCi0tLS0gIAoKIyMgU3BlY2lhbCBISURERU4gUiBmaWxlcyBpbiB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5ICAKCjxwPgoKLSBSU3R1ZGlvIHVzZXMgdGhyZWUgaW1wb3J0YW50IGhpZGRlbiBmaWxlcy4gWW91IGNhbiBzZWUgdGhlbSBpbiB0aGUgUlN0dWRpbyBmaWxlcyBwYW5lIGJ1dCB1c3VhbGx5IG5vdCBpbiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0uCgogICAgLSBfXy5SRGF0YV9fIGhvbGRzIHRoZSBvYmplY3RzIHRoYXQgYXJlIGxvYWRlZCBpbiB5b3VyIGVudmlyb25tZW50LgoKICAgIC0gX18uUkhpc3RvcnlfXyBob2xkcyB0aGUgaGlzdG9yeSBvZiB0aGUgY29kZSB5b3UgaGF2ZSBleGVjdXRlZCBpbiB0aGUgY29uc29sZS4KCiAgICAtIF9fLlJwcm9maWxlX18gaG9sZHMgc3BlY2lmaWMgc2V0LXVwIGluZm9ybWF0aW9uIGZvciB0aGUgcHJvamVjdCB5b3UgYXJlIHdvcmtpbmcgaW4uCgo8cD4KCi0gSGVyZSBhcmUgdGhlIGhpZGRlbiBmaWxlcyBpbiBteSB3b3JraW5nIGRpcmVjdG9yeSBzaG93biBpbiByZWQgYW5kIHRoZSBwcm9qZWN0IGZpbGUgd2hpY2ggaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgbXkgcHJvamVjdCBpbiBibHVlLjoKCjxwPgoKIVtdKGFzc2V0cy9wMTQucG5nKQoKLS0tLQoKIyMgVXNpbmcgdGhlICIuUnByb2ZpbGUiIGZpbGUgdG8gY29uZmlndXJlIGFuIFIgc2Vzc2lvbgoKPHA+CgotIFRoZSAuUnByb2ZpbGUgZmlsZSBleGVjdXRlcyBjb2RlIGFzIFIgc3RhcnRzIHVwLiBZb3UgY2FuIHVzZSB0aGlzIGZpbGUgdG8gYXV0b21hdGljYWxseSBsb2FkIHRoZSBwYWNrYWdlcyB5b3Ugd2lsbCBuZWVkIHRvIHVzZSBmb3IgdGhpcyBjb3Vyc2UgYW5kIHRvIHNldCBzb21lIFIgb3B0aW9ucy4gVGh1cyAuUnByb2ZpbGUgYWxsb3dzIHlvdSB0byBjdXN0b21pc2UgdGhlIHN0YXJ0LXVwIG9mIFIuCgogICAgLSBSZW1lbWJlciB0aGF0IHRoZSBwYWNrYWdlcyBtdXN0IGFscmVhZHkgYmUgaW5zdGFsbGVkIG9uIHlvdXIgY29tcHV0ZXIgdG8gYmUgbG9hZGVkIGJ5IHRoZSAuUnByb2ZpbGUgZmlsZS4KICAgIAo8cD4KCi0gSGVyZSBpcyB0aGUgY29kZSB5b3Ugd2lsbCBuZWVkIGluIHlvdXIgLlJwcm9maWxlIGZpbGUgZm9yIHRoaXMgY291cnNlLgoKYGBge3IsIGV2YWw9RkFMU0V9CiMgUG9ydGZvbGlvIE1hbmFnZW1lbnQgLlJwcm9maWxlIGZpbGUKCiMgQXV0by1sb2FkIHBhY2thZ2VzOgpsaWJyYXJ5KEFFUikKbGlicmFyeShicm9vbSkKbGlicmFyeShkYXRhLnRhYmxlKQpsaWJyYXJ5KGR5bmxtKQpsaWJyYXJ5KGZCYXNpY3MpCmxpYnJhcnkoZkdhcmNoKQpsaWJyYXJ5KEZpbkNhbCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkobWFncml0dHIpCmxpYnJhcnkoTUFTUykKbGlicmFyeShtYXRyaXhTdGF0cykKbGlicmFyeShxdWFkcHJvZykKbGlicmFyeShxdWFudG1vZCkKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkocmVzaGFwZTIpCmxpYnJhcnkocm1hcmtkb3duKQpsaWJyYXJ5KHN0YXJnYXplcikKbGlicmFyeSh0aW1lU2VyaWVzKQpsaWJyYXJ5KHRzZXJpZXMpCmxpYnJhcnkod2VzYW5kZXJzb24pCmxpYnJhcnkoeHRhYmxlKQpsaWJyYXJ5KHh0cykKbGlicmFyeSh0aWR5cXVhbnQpCmxpYnJhcnkodGlkeXZlcnNlKQoKIyBTZXQgc29tZSBvZiBSIG9wdGlvbnM6Cm9wdGlvbnMocHJvbXB0PSJSPiAiLCBzY2lwZW49OTk5LCBkaWdpdHM9NCwgd2lkdGg9ODApCmBgYAoKPHA+CgotIFRvIG1ha2UgeW91ciAuUnByb2ZpbGUgZmlsZSwgZm9sbG93IHRoZXNlIHN0ZXBzLgoKLSBDcmVhdGUgYSBuZXcgUiBTY3JpcHQgZmlsZS4KICAgIAo8cD4KCiFbXShhc3NldHMvcDE1LnBuZykKCjxwPgoKLSBZb3VyIFIgU2NyaXB0IGZpbGUgaXMgc2hvd24gYmVsb3cuIEFuIFIgU2NyaXB0IGZpbGUgaXMgYSB0ZXh0IGZpbGUgdGhhdCB5b3UgY2FuIHNhdmUgY29kZSBpbi4KCjxwPgoKIVtdKGFzc2V0cy9wMTYucG5nKQoKPHA+CgotIENvcHkgYWxsIG9mIHRoZSBjb2RlIGZyb20gdGhlIFBvcnRmb2xpbyBNYW5hZ2VtZW50IC5ScHJvZmlsZSBmaWxlIGFib3ZlIGFuZCBwYXN0ZSBpdCBpbnRvIHlvdXIgUiBTY3JpcHQgZmlsZS4gCgo8cD4KCiFbXShhc3NldHMvcDE3LnBuZykKCjxwPgoKLSBTYXZlIHRoZSBSIFNjcmlwdCBmaWxlIGluIHlvdXIgd29ya2luZyBkaXJlY3RvcnkgKHlvdXIgcHJvamVjdCBkaXJlY3RvcnkpLiBUaGUgZmlsZSBuYW1lIGRvZXMgbm90IG1hdHRlciBmb3Igbm93LgoKPHA+CgohW10oYXNzZXRzL3AxOC5wbmcpCjxwPgoKIVtdKGFzc2V0cy9wMTkucG5nKQoKPHA+CgotIFJlbmFtZSB0aGUgZmlsZSBhcyAiLlJwcm9maWxlIi4KCjxwPgoKIVtdKGFzc2V0cy9wMjAucG5nKQo8cD4KCiFbXShhc3NldHMvcDIxLnBuZykKPHA+CgotIFlvdSBzaG91bGQgbm93IGhhdmUgeW91ciAuUnByb2ZpbGUgZmlsZSBpbiB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5LiBJZiB5b3UgcmVzdGFydCBSU3R1ZGlvLCB5b3VyIHBhY2thZ2VzIHNob3VsZCBsb2FkIGF1dG9tYXRpY2FsbHkuCgotIFlvdSBtYXkgZWRpdCB0aGUgLlJwcm9maWxlIGZpbGUgdG8gYWRkIGxpYnJhcnkgY29tbWFuZHMgZm9yIGFkZGl0aW9uYWwgcGFja2FnZXMgeW91IG1pZ2h0IHdhbnQgdG8gbG9hZCB3aGVuIFIgc3RhcnRzIHVwLgoKLS0tLQoKIyMgUm1hcmtkb3duIGFuZCBOb3RlYm9va3MKCjxwPgoKLSBfX1JtYXJrZG93bl9fIGFsbG93cyBkeW5hbWljIGRvY3VtZW50cyB0byBiZSBjcmVhdGVkIGluIFIgdGhhdCBjb250YWluIHdyaXR0ZW4gdGV4dCwgUiBjb2RlIGFuZCBvdXRwdXQgZnJvbSB0aGUgY29kZS4gCgotIEkgd2lsbCBhc2sgeW91IHRvIGRvIHNvbWUgYXNzaWdubWVudHMgaW4gYW4gUiBOb3RlYm9vayB1c2luZyBtYXJrZG93bi4gCgogICAgLSBUaGlzIGd1aWRlIGZvciBzZXR0aW5nLXVwIFIgYW5kIFJTdHVkaW8gd2FzIG1hZGUgaW4gYW4gUiBOb3RlYm9vay4gSWYgeW91IGxvb2sgYXQgdGhlIHRvcCBvZiB0aGUgcGFnZSB5b3UgY2FuIHNlZSBhIGJ1dHRvbiBsYWJlbGxlZCAiQ29kZSIgd2hpY2ggYWxvd3MgeW91IHRvIGRvd25sb2FkIHRoZSBjb2RlIEkgdXNlZCB0byBtYWtlIHRoaXMgSFRNTCBmaWxlLgogICAgCjxwPgoKLSBBIG1hcmtkb3duIGRvY3VtZW50IGlzIHdyaXR0ZW4gaW4gdXNpbmcgY29kaW5nIGNhbGxlZCBtYXJrZG93biwgd2hpY2ggaXMgYW4gZWFzeS10by13cml0ZSBwbGFpbiB0ZXh0IGZvcm1hdCB0aGF0IGlzIHJlbGF0ZWQgdG8gVGVYIChvciBMYVRlWCkuCgotIEEgVGVYIGluc3RhbGxhdGlvbiBpcyByZXF1aXJlZCB0byB1c2UgUm1hcmtkb3duLCBzdWNoIGFzIE1hY1RleCAoZm9yIE1hYyBPUykgaHR0cDovL3d3dy50dWcub3JnL21hY3RleC8gb3IgTWlLVGVYIChjcm9zcy1wbGF0Zm9ybSkgaHR0cHM6Ly9taWt0ZXgub3JnL2Rvd25sb2FkLiBJZiB5b3UgdXNlIExhVGVYIHRvIHdyaXRlIGRvY3VtZW50cywgeW91IHdpbGwgYWxyZWFkeSBoYXZlIHRoaXMuIElmIG5vdCwgdGhlIGVhc2llc3Qgd2F5IHRvIGdldCBhIFRlWCBpbnN0YWxsYXRpb24gZm9yIG1hcmtkb3duIGlzIHZpYSB0aGUgVGlueVRlWCBwYWNrYWdlLgoKLS0tLQoKIyMgSW5zdGFsbCBUaW55VGVYIHVzaW5nIHRoZSBwYWNrYWdlIGNhbGxlZCB0aW55dGV4Cgo8cD4KCi0gWW91IGhhdmUgYWxyZWFkeSBpbnN0YWxsZWQgdGhlIHBhY2thZ2UgY2FsbGVkIHRpbnl0ZXguIEV4ZWN1dGluZyB0aGUgY29kZSBiZWxvdyBpbiB0aGUgY29uc29sZSB3aWxsIGRvd25sb2FkIHRoZSBUaW55VGVYIGZpbGVzIGZyb20gdGhlIGludGVybmV0IGFuZCBpbnN0YWxsIHRoZW0gb24geW91ciBjb21wdXRlciBzbyB0aGF0IHlvdSBjYW4gbWFrZSBtYXJrZG93biBkb2N1bWVudHMuIAoKPHA+CgpgYGB7ciwgZXZhbD1GLCBtZXNzYWdlPUZBTFNFfQp0aW55dGV4OjppbnN0YWxsX3Rpbnl0ZXgoKQpgYGAKCjxwPgoKLSBUaGlzIHdpbGwgdGFrZSBzb21lIHRpbWUgdG8gZG93bmxvYWQuCgotIE5vdGUgdGhhdCB5b3UgZG8gbm90IG5lZWQgdG8gZG8gdGhpcyBpZiB5b3UgdXNlIFJTdHVkaW8gQ2xvdWQgYXMgVGlueVRlWCBpcyBwcmUtaW5zdGFsbGVkLgoKLSBXaGVuIHRoZSBpbnN0YWxsYXRpb24gaGFzIGZpbmlzaGVkLCByZXN0YXJ0IFJTdHVkaW8uCgotLS0tCgojIyBUZXN0IHlvdXIgUm1hcmtkb3duIGVudmlyb25tZW50CgotIFJ1biB0aHJvdWdoIGEgc2ltcGxlIHRlc3QgdG8gc2VlIGlmIHlvdSBjYW4gbWFrZSBhbiBSIE5vdGVib29rLCBhcyBmb2xsb3dzLgoKLSBPcGVuIGEgbmV3IFIgTm90ZWJvb2suCgo8cD4KCiFbXShhc3NldHMvcDIyLnBuZykKCjxwPgoKLSBUaGUgbm90ZWJvb2sgYWxyZWFkeSBjb250YWlucyBleGFtcGxlIHRleHQgYW5kIFIgY29kZSB0aGF0IHBsb3RzIGEgc2ltcGxlIGNoYXJ0LgoKPHA+CgohW10oYXNzZXRzL3AyMy5wbmcpCgo8cD4KCi0gUnVuIHRoZSBjb2RlIGJ5IHByZXNzaW5nICJSdW4gQWxsIiBmcm9tIHRoZSAiUnVuIiBtZW51LgoKPHA+CgohW10oYXNzZXRzL3AyNC5wbmcpCgo8cD4KCi0gQWZ0ZXIgeW91IGhhdmUgcnVuIHRoZSBjb2RlLCB5b3UgIHNob3VsZCBzZWUgdGhlIHBsb3QgYXBwZWFyLgoKLSBJbmNsdWRlIHlvdXIgbmFtZSBhcyBJIGhhdmUgYXQgdGhlIHRvcCBvZiB0aGUgTm90ZWJvb2suCgo8cD4KCiFbXShhc3NldHMvcDI1LnBuZykKCjxwPgoKLSBTYXZlIHRoZSBmaWxlIHRvIHlvdXIgd29ya2luZyBkaXJlY3RvcnkuIAoKPHA+CgohW10oYXNzZXRzL3AyNi5wbmcpCgo8cD4KCi0gWW91IHNob3VsZCBzZWUgdHdvIGZpbGVzIGFwcGVhci4gCgogICAgLSBZb3VyIGNvZGUgaXMgaW4gdGhlIGZpbGUgd2l0aCB0aGUgZXh0ZW5zaW9uICIuUm1kIi4KICAgIAogICAgLSBZb3VyIEhUTUwgUiBOb3RlYm9vayBoYXMgdGhlIGV4dGVuc2lvbiAiLm5iLmh0bWwiLiAKICAgIAogICAgPHA+CgohW10oYXNzZXRzL3AyNy5wbmcpCgo8cD4KCi0gT3BlbiB0aGUgSFRNTCBmaWxlIHdpdGggeW91ciBicm93c2VyLiBJdCBzaG91bGQgbG9vayBsaWtlIHRoaXM6Cgo8cD4KCiFbXShhc3NldHMvcDI4LnBuZykKCjxwPgoKLSBXZWxsIGRvbmUhIFlvdSBoYXZlIGNyZWF0ZWQgYSBOb3RlYm9vay4KCi0tLS0KCiMjIEluZm9ybWF0aW9uIG9uIFJtYXJrZG93biBhbmQgVGlueVRlWAoKLSBJbmZvcm1hdGlvbiBvbiBSbWFya2Rvd24gY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tLyBhbmQgYSB1c2VmdWwgZ3VpZGUgaXMgYXQgaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duLyBhbmQgaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duLWNvb2tib29rLyBhbmQgaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duLy4gRWFzeSBhbmQgaGVscGZ1bCB2aWRlbyBsZXNzb25zIGNhbiBiZSBmb3VuZCBhdCBodHRwczovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbS9sZXNzb24tMS5odG1sLgoKLSBSZWZlcmVuY2UgbWF0ZXJpYWwgZm9yIFRpbnlUZVggaXMgYXQgaHR0cHM6Ly95aWh1aS5uYW1lL3Rpbnl0ZXgvLgoKLS0tLQoKIyMgUmVzb3VyY2VzIGZvciBSCgo8cD4KCi0gVGhlcmUgYXJlIG1hbnkgZ3VpZGVzIHRvIHVzaW5nIFIgYXZhaWxhYmxlIG9ubGluZSwgYm90aCBkb2N1bWVudHMgYW5kIHZpZGVvcy4gCgotIEEgY29tcHJlaGVuc2l2ZSBpbnRyb2R1Y3Rpb24gaXMgYXZhaWxhYmxlIG9uIEFJTVMgQFZlbmFibGVzMjAxOSBhbmQgYXQgaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvZG9jL21hbnVhbHMvci1yZWxlYXNlL1ItaW50cm8ucGRmLiAKCi0gT3RoZXIgUiBkb2N1bWVudGF0aW9uIGFuZCBndWlkZXMgZm9yIHZhcmlvdXMgYXBwbGljYXRpb25zIGNvbnRyaWJ1dGVkIGJ5IFIgdXNlcnMgY2FuIGJlIGZvdW5kIGhlcmU6IGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL290aGVyLWRvY3MuaHRtbCNlbmdsaXNoLgoKLSBNeSBUQSBhdCBLb2JlIFVuaXZlcnNpdHkgcHJvZHVjZWQgdGhlIGZvbGxvd2luZyBndWlkZXMsIGF2YWlsYWJsZSBhdCBbTWFzc2ltaWxpYW5vJ3MgUiBQYWdlIG9uIEdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL21hc3NpbWlsaWFub2ovUl9iZWdpbm5lcnMpLgoKICAgIC0gUiBmb3IgQmVnaW5uZXJzICAKICAgIC0gUiBNYXJrZG93bjogTm90ZXMgZm9yIEVkaXRpbmcgIAogICAgLSBMYVRlWDogRWRpdGluZyBmb3IgTWF0aGVtYXRpY3MgIAoKLS0tLQoKIyMgQ1JBTiBUYXNrIFZpZXdzCgo8cD4KCi0gQ1JBTiBUYXNrIFZpZXdzIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgcGFja2FnZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIFIuIFBhY2thZ2VzIGV4dGVuZCB0aGUgZnVuY3Rpb25hbGl0eSBvZiBSLiBUaGV5IHByb3ZpZGUgcm91dGluZXMgZm9yIHZhcmlvdXMgdHlwZXMgb2YgZGF0YSBtYW5pcHVsYXRpb24sIG1hdGhlbWF0aWNhbCBhbmQgZWNvbm9tZXRyaWMgbW9kZWxzLCBvcHRpbWlzYXRpb24gbWV0aG9kcywgZmluYW5jaWFsIG1vZGVscyBhbmQgbW9yZS4gUGFja2FnZXMgYXJlIGNvbnN0YW50bHkgYmVpbmcgZGV2ZWxvcGVkIGFuZCB1cGRhdGVkIGJ5IFIgdXNlcnMuCgotIFRocmVlIFRhc2sgVmlld3MgYXJlIHVzZWZ1bCB0aGlzIGNvdXJzZTogIAoKICAgIC0gRW1waXJpY2FsIGZpbmFuY2U6IGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi92aWV3cy9GaW5hbmNlLmh0bWwgCgogICAgLSBFY29ub21ldHJpY3M6IGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi92aWV3cy9FY29ub21ldHJpY3MuaHRtbCAgCgogICAgLSBUaW1lIHNlcmllczogaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3ZpZXdzL1RpbWVTZXJpZXMuaHRtbCAgCiAKLS0tLQoKIyMgQm9va3Mgb24gUgoKPHA+CgotIE1hbnkgYm9va3MgaGF2ZSBiZWVuIHB1Ymxpc2hlZCBvbiB1c2luZyBSLCBwcm9ncmFtbWluZyB3aXRoIFIsIGFuZCB1c2luZyBSIGZvciBmaW5hbmNlLgoKICAgIC0gRmluYW5jZTogQEJlbm5ldHQyMDE2LCBAQW5kcmVjdXQyMDEwLCBAVHNheTIwMTAsIEBUc2F5MjAxNAoKICAgIC0gRWNvbm9tZXRyaWNzOiBAS2xlaWJlcjIwMDgsIEBIb3JuaWsyMDA5CiAgICAKICAgIC0gQ29kaW5nOiBATWF0bG9mZjIwMTEKCi0tLS0KCiMjIFItQmxvZ2dlcnMgIAoKPHA+CgotIFItQmxvZ2dlcnMgaXMgYSBibG9nIHNpdGUgY29udGFpbmluZyBtYW55IGhlbHBmdWwgcG9zdHMgb24gdXNpbmcgUjogaHR0cDovL3d3dy5yLWJsb2dnZXJzLmNvbS8gIAoKLSBUaGUgcG9zdHMgb24gdGhlIHNpdGUgc2hvdyB0aGUgd2lkZSB2YXJpZXR5IG9mIHByb2JsZW1zIHRoYXQgY29kaW5nIGluIFIgY2FuIGJlIGFwcGxpZWQgdG8gKG5vdCBqdXN0IGZpbmFuY2UpLiBGb3IgZXhhbXBsZToKCiAgICAtIGh0dHBzOi8vd3d3LnItYmxvZ2dlcnMuY29tL3doby13cm90ZS10aGF0LWFub255bW91cy1ueXQtb3AtZWQtdGV4dC1zaW1pbGFyaXR5LWFuYWx5c2VzLXdpdGgtci8KCiAgICAtIGh0dHBzOi8vd3d3LnItYmxvZ2dlcnMuY29tL2hvdy10by1idWlsZC1hbmltYXRlZC1iYXItcGxvdHMtdXNpbmctci8KCjxwPgoKLSBBIGdvb2QgaW50cm9kdWN0aW9uIHRvIGxlYXJuaW5nIFI6IGh0dHBzOi8vd3d3LnItYmxvZ2dlcnMuY29tL2hvdy10by1sZWFybi1yLTIvCgotLS0tCgojIyBTZWFyY2ggIAoKPHA+CgotIExvdHMgb2YgaW5mb3JtYXRpb24gaXMgcG9zdGVkIG9ubGluZSBieSBSIHVzZXJzIGluY2x1ZGluZyBxdWVzdGlvbnMgYW5kIGFuc3dlcnMuICAKCi0gSWYgeW91IGFyZSBzdHVjaywgc2VhcmNoIGZvciBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgaGVscCB5b3UgYW5zd2VyIHlvdXIgcXVlc3Rpb24uIAoKLSByc2VlayBpcyBhIHNlYXJjaCBlbmdpbmUgZm9yIFI6IHd3dy5yc2Vlay5vcmcKCi0gVXNpbmcgYW5vdGhlciBzZWFyY2ggZW5naW5lIGxpa2UgR29vZ2xlOiAgCgogICAgLSAiZmlsZXR5cGU6UiByZWdyZXNzaW9uIOKAk3JlYm9sIiAgCgogICAgLSAiQ1JBTiByZWdyZXNzaW9uIiAgIAoKLS0tLQoKIyMgUlN0dWRpbyBLZXlib2FyZCBTaG9ydGN1dHMgKGZvciBNYWMpCgo8cD4KCi0gQ29kZSBjb21wbGV0aW9uOgogICAgLSBUeXBlIHBhcnQgb2YgdGhlIGZ1bmN0aW9uIHlvdSB3YW50IGFuZCB0aGVuIHByZXNzIHRoZSBUYWIga2V5LiAgCiAgICAtIEFsc28gd29ya3MgZm9yIGZ1bmN0aW9uIGFyZ3VtZW50cywgdGhhdCBpcyBwcmVzcyBUYWIgd2hlbiB5byB1YXJlIGluc2lkZSB0aGUgYnJhY2tldHMgb2YgYSBmdW5jdGlvbi4gIAogICAgLSBBbHNvIHJlY2FsbHMgb2JqZWN0IG5hbWVzLgoKPHA+CgotIFByZXNzIEYxIChvciBmbitGMSkgZm9yIGhlbHAgb24gYSBmdW5jdGlvbi4gCiAgCi0gUmV0cmlldmUgcHJldmlvdXMgY29tbWFuZHM6ICAKICAgIC0gUHJlc3MgdGhlIHVwIG9yIGRvd24gYXJyb3dzIHRvIHNjcm9sbCB0aHJvdWdoIHlvdXIgY29kZSBoaXN0b3J5LgogIAo8cD4KCi0gVmlldyBhIGxpc3Qgb2YgcHJldmlvdXMgY29tbWFuZHM6ICAKICAgIC0gUHJlc3MgQ29udHJvbCAob3IgQ29tbWFuZCkgYW5kIHRoZSB1cCBhcnJvdy4KCjxwPgoKLSBWaWV3IGEgbGlzdCBvZiBwcmV2aW91cyBjb21tYW5kcyB0aGF0IG1hdGNoIGEgcHJlZml4OiAgCiAgICAtIFR5cGUgdGhlIHByZWZpeCBhbmQgcHJlc3MgQ29udHJvbCAob3JDb21tYW5kKSBhbmQgdGhlIHVwIGFycm93LiAKCjxwPgoKLSBFbnRlciBhIGxpbmUgb2YgY29kZSBmcm9tIGFuIFIgc2NyaXB0IHRvIHRoZSBjb25zb2xlOgogICAgLSBDb21tYW5kIGFuZCBlbnRlci4KCjxwPgoKLSBFbnRlciBhIGxpbmUgb2YgY29kZSBmcm9tIGhpc3RvcnkgdG8gYW5kIFIgc2NyaXB0OgogICAgLSBTaGlmdCBhbmQgZW50ZXIuCgo8cD4KCi0gTW9yZTogIAogICAgLSBUb29scyAtPiBLZXlib2FyZCBTaG9ydGN1dHMgSGVscCAgCiAgICAtIGh0dHBzOi8vc3VwcG9ydC5yc3R1ZGlvLmNvbS9oYy9lbi11cy9hcnRpY2xlcy8yMDA3MTE4NTMgIAogICAgCi0tLS0KCjxwPgoKIMKpIENvcHlyaWdodCBDbGludG9uIFdhdGtpbnMgMjAyMQogCi0tLS0KCiMjIFJlZmVyZW5jZXMKCjxwPgo=